﻿// Copyright notices:
// ---
// Originally Written in 2012 by Christian Winnerlein  <codesinchaos@gmail.com>
// Rewritten Fall 2014 (for the Blake2s flavor instead of the Blake2b flavor)
//   by Dustin Sparks <sparkdustjoe@gmail.com>

// To the extent possible under law, the author(s) have dedicated all copyright
// and related and neighboring rights to this software to the public domain
// worldwide. This software is distributed without any warranty.

// You should have received a copy of the CC0 Public Domain Dedication along with
// this software. If not, see <http://creativecommons.org/publicdomain/zero/1.0/>.
// ---
// Based on BlakeSharp
// by Dominik Reichl <dominik.reichl@t-online.de>
// Web: http://www.dominik-reichl.de/
// If you're using this class, it would be nice if you'd mention
// me somewhere in the documentation of your program, but it's
// not required.
// BLAKE was designed by Jean-Philippe Aumasson, Luca Henzen,
// Willi Meier and Raphael C.-W. Phan.
// BlakeSharp was derived from the reference C implementation.
// ---
// This implementation is based on: https://github.com/SparkDustJoe/miniLockManaged
// Reason:
// - Have a single nuget package for Blake2s
// - Added libsodium-net similar interface for the hash functions.
// <auto-generated />

using System;

namespace Blake2s
{
    public sealed partial class Blake2sCore
    {
        partial void Compress(byte[] block, int start)
        {
            if (BitConverter.IsLittleEndian)
            {
                Buffer.BlockCopy(block, start, _m, 0, BlockSizeInBytes);
            }
            else
            {
                for (var i = 0; i < 16; i += 4)
                    _m[i] = BytesToUInt32(block, start + i); //
            }

            var m0 = _m[0];
            var m1 = _m[1];
            var m2 = _m[2];
            var m3 = _m[3];
            var m4 = _m[4];
            var m5 = _m[5];
            var m6 = _m[6];
            var m7 = _m[7];
            var m8 = _m[8];
            var m9 = _m[9];
            var m10 = _m[10];
            var m11 = _m[11];
            var m12 = _m[12];
            var m13 = _m[13];
            var m14 = _m[14];
            var m15 = _m[15]; //*/

            var v0 = _h[0];
            var v1 = _h[1];
            var v2 = _h[2];
            var v3 = _h[3];
            var v4 = _h[4];
            var v5 = _h[5];
            var v6 = _h[6];
            var v7 = _h[7];

            var v8 = IV0;
            var v9 = IV1;
            var v10 = IV2;
            var v11 = IV3;
            var v12 = IV4 ^ _counter0;
            var v13 = IV5 ^ _counter1;
            var v14 = IV6 ^ _finalizationFlag0;
            var v15 = IV7 ^ _finalizationFlag1;

            // Rounds
//*
            // Round 1.
            v0 += m0;
            v0 += v4;
            v12 ^= v0;
            v12 = v12 << (32 - 16) | v12 >> 16;
            v8 += v12;
            v4 ^= v8;
            v4 = v4 << (32 - 12) | v4 >> 12;
            v1 += m2;
            v1 += v5;
            v13 ^= v1;
            v13 = v13 << (32 - 16) | v13 >> 16;
            v9 += v13;
            v5 ^= v9;
            v5 = v5 << (32 - 12) | v5 >> 12;
            v2 += m4;
            v2 += v6;
            v14 ^= v2;
            v14 = v14 << (32 - 16) | v14 >> 16;
            v10 += v14;
            v6 ^= v10;
            v6 = v6 << (32 - 12) | v6 >> 12;
            v3 += m6;
            v3 += v7;
            v15 ^= v3;
            v15 = v15 << (32 - 16) | v15 >> 16;
            v11 += v15;
            v7 ^= v11;
            v7 = v7 << (32 - 12) | v7 >> 12;
            v2 += m5;
            v2 += v6;
            v14 ^= v2;
            v14 = v14 << (32 - 8) | v14 >> 8;
            v10 += v14;
            v6 ^= v10;
            v6 = v6 << (32 - 7) | v6 >> 7;
            v3 += m7;
            v3 += v7;
            v15 ^= v3;
            v15 = v15 << (32 - 8) | v15 >> 8;
            v11 += v15;
            v7 ^= v11;
            v7 = v7 << (32 - 7) | v7 >> 7;
            v1 += m3;
            v1 += v5;
            v13 ^= v1;
            v13 = v13 << (32 - 8) | v13 >> 8;
            v9 += v13;
            v5 ^= v9;
            v5 = v5 << (32 - 7) | v5 >> 7;
            v0 += m1;
            v0 += v4;
            v12 ^= v0;
            v12 = v12 << (32 - 8) | v12 >> 8;
            v8 += v12;
            v4 ^= v8;
            v4 = v4 << (32 - 7) | v4 >> 7;
            v0 += m8;
            v0 += v5;
            v15 ^= v0;
            v15 = v15 << (32 - 16) | v15 >> 16;
            v10 += v15;
            v5 ^= v10;
            v5 = v5 << (32 - 12) | v5 >> 12;
            v1 += m10;
            v1 += v6;
            v12 ^= v1;
            v12 = v12 << (32 - 16) | v12 >> 16;
            v11 += v12;
            v6 ^= v11;
            v6 = v6 << (32 - 12) | v6 >> 12;
            v2 += m12;
            v2 += v7;
            v13 ^= v2;
            v13 = v13 << (32 - 16) | v13 >> 16;
            v8 += v13;
            v7 ^= v8;
            v7 = v7 << (32 - 12) | v7 >> 12;
            v3 += m14;
            v3 += v4;
            v14 ^= v3;
            v14 = v14 << (32 - 16) | v14 >> 16;
            v9 += v14;
            v4 ^= v9;
            v4 = v4 << (32 - 12) | v4 >> 12;
            v2 += m13;
            v2 += v7;
            v13 ^= v2;
            v13 = v13 << (32 - 8) | v13 >> 8;
            v8 += v13;
            v7 ^= v8;
            v7 = v7 << (32 - 7) | v7 >> 7;
            v3 += m15;
            v3 += v4;
            v14 ^= v3;
            v14 = v14 << (32 - 8) | v14 >> 8;
            v9 += v14;
            v4 ^= v9;
            v4 = v4 << (32 - 7) | v4 >> 7;
            v1 += m11;
            v1 += v6;
            v12 ^= v1;
            v12 = v12 << (32 - 8) | v12 >> 8;
            v11 += v12;
            v6 ^= v11;
            v6 = v6 << (32 - 7) | v6 >> 7;
            v0 += m9;
            v0 += v5;
            v15 ^= v0;
            v15 = v15 << (32 - 8) | v15 >> 8;
            v10 += v15;
            v5 ^= v10;
            v5 = v5 << (32 - 7) | v5 >> 7;

            // Round 2.
            v0 += m14;
            v0 += v4;
            v12 ^= v0;
            v12 = v12 << (32 - 16) | v12 >> 16;
            v8 += v12;
            v4 ^= v8;
            v4 = v4 << (32 - 12) | v4 >> 12;
            v1 += m4;
            v1 += v5;
            v13 ^= v1;
            v13 = v13 << (32 - 16) | v13 >> 16;
            v9 += v13;
            v5 ^= v9;
            v5 = v5 << (32 - 12) | v5 >> 12;
            v2 += m9;
            v2 += v6;
            v14 ^= v2;
            v14 = v14 << (32 - 16) | v14 >> 16;
            v10 += v14;
            v6 ^= v10;
            v6 = v6 << (32 - 12) | v6 >> 12;
            v3 += m13;
            v3 += v7;
            v15 ^= v3;
            v15 = v15 << (32 - 16) | v15 >> 16;
            v11 += v15;
            v7 ^= v11;
            v7 = v7 << (32 - 12) | v7 >> 12;
            v2 += m15;
            v2 += v6;
            v14 ^= v2;
            v14 = v14 << (32 - 8) | v14 >> 8;
            v10 += v14;
            v6 ^= v10;
            v6 = v6 << (32 - 7) | v6 >> 7;
            v3 += m6;
            v3 += v7;
            v15 ^= v3;
            v15 = v15 << (32 - 8) | v15 >> 8;
            v11 += v15;
            v7 ^= v11;
            v7 = v7 << (32 - 7) | v7 >> 7;
            v1 += m8;
            v1 += v5;
            v13 ^= v1;
            v13 = v13 << (32 - 8) | v13 >> 8;
            v9 += v13;
            v5 ^= v9;
            v5 = v5 << (32 - 7) | v5 >> 7;
            v0 += m10;
            v0 += v4;
            v12 ^= v0;
            v12 = v12 << (32 - 8) | v12 >> 8;
            v8 += v12;
            v4 ^= v8;
            v4 = v4 << (32 - 7) | v4 >> 7;
            v0 += m1;
            v0 += v5;
            v15 ^= v0;
            v15 = v15 << (32 - 16) | v15 >> 16;
            v10 += v15;
            v5 ^= v10;
            v5 = v5 << (32 - 12) | v5 >> 12;
            v1 += m0;
            v1 += v6;
            v12 ^= v1;
            v12 = v12 << (32 - 16) | v12 >> 16;
            v11 += v12;
            v6 ^= v11;
            v6 = v6 << (32 - 12) | v6 >> 12;
            v2 += m11;
            v2 += v7;
            v13 ^= v2;
            v13 = v13 << (32 - 16) | v13 >> 16;
            v8 += v13;
            v7 ^= v8;
            v7 = v7 << (32 - 12) | v7 >> 12;
            v3 += m5;
            v3 += v4;
            v14 ^= v3;
            v14 = v14 << (32 - 16) | v14 >> 16;
            v9 += v14;
            v4 ^= v9;
            v4 = v4 << (32 - 12) | v4 >> 12;
            v2 += m7;
            v2 += v7;
            v13 ^= v2;
            v13 = v13 << (32 - 8) | v13 >> 8;
            v8 += v13;
            v7 ^= v8;
            v7 = v7 << (32 - 7) | v7 >> 7;
            v3 += m3;
            v3 += v4;
            v14 ^= v3;
            v14 = v14 << (32 - 8) | v14 >> 8;
            v9 += v14;
            v4 ^= v9;
            v4 = v4 << (32 - 7) | v4 >> 7;
            v1 += m2;
            v1 += v6;
            v12 ^= v1;
            v12 = v12 << (32 - 8) | v12 >> 8;
            v11 += v12;
            v6 ^= v11;
            v6 = v6 << (32 - 7) | v6 >> 7;
            v0 += m12;
            v0 += v5;
            v15 ^= v0;
            v15 = v15 << (32 - 8) | v15 >> 8;
            v10 += v15;
            v5 ^= v10;
            v5 = v5 << (32 - 7) | v5 >> 7;

            // Round 3.
            v0 += m11;
            v0 += v4;
            v12 ^= v0;
            v12 = v12 << (32 - 16) | v12 >> 16;
            v8 += v12;
            v4 ^= v8;
            v4 = v4 << (32 - 12) | v4 >> 12;
            v1 += m12;
            v1 += v5;
            v13 ^= v1;
            v13 = v13 << (32 - 16) | v13 >> 16;
            v9 += v13;
            v5 ^= v9;
            v5 = v5 << (32 - 12) | v5 >> 12;
            v2 += m5;
            v2 += v6;
            v14 ^= v2;
            v14 = v14 << (32 - 16) | v14 >> 16;
            v10 += v14;
            v6 ^= v10;
            v6 = v6 << (32 - 12) | v6 >> 12;
            v3 += m15;
            v3 += v7;
            v15 ^= v3;
            v15 = v15 << (32 - 16) | v15 >> 16;
            v11 += v15;
            v7 ^= v11;
            v7 = v7 << (32 - 12) | v7 >> 12;
            v2 += m2;
            v2 += v6;
            v14 ^= v2;
            v14 = v14 << (32 - 8) | v14 >> 8;
            v10 += v14;
            v6 ^= v10;
            v6 = v6 << (32 - 7) | v6 >> 7;
            v3 += m13;
            v3 += v7;
            v15 ^= v3;
            v15 = v15 << (32 - 8) | v15 >> 8;
            v11 += v15;
            v7 ^= v11;
            v7 = v7 << (32 - 7) | v7 >> 7;
            v1 += m0;
            v1 += v5;
            v13 ^= v1;
            v13 = v13 << (32 - 8) | v13 >> 8;
            v9 += v13;
            v5 ^= v9;
            v5 = v5 << (32 - 7) | v5 >> 7;
            v0 += m8;
            v0 += v4;
            v12 ^= v0;
            v12 = v12 << (32 - 8) | v12 >> 8;
            v8 += v12;
            v4 ^= v8;
            v4 = v4 << (32 - 7) | v4 >> 7;
            v0 += m10;
            v0 += v5;
            v15 ^= v0;
            v15 = v15 << (32 - 16) | v15 >> 16;
            v10 += v15;
            v5 ^= v10;
            v5 = v5 << (32 - 12) | v5 >> 12;
            v1 += m3;
            v1 += v6;
            v12 ^= v1;
            v12 = v12 << (32 - 16) | v12 >> 16;
            v11 += v12;
            v6 ^= v11;
            v6 = v6 << (32 - 12) | v6 >> 12;
            v2 += m7;
            v2 += v7;
            v13 ^= v2;
            v13 = v13 << (32 - 16) | v13 >> 16;
            v8 += v13;
            v7 ^= v8;
            v7 = v7 << (32 - 12) | v7 >> 12;
            v3 += m9;
            v3 += v4;
            v14 ^= v3;
            v14 = v14 << (32 - 16) | v14 >> 16;
            v9 += v14;
            v4 ^= v9;
            v4 = v4 << (32 - 12) | v4 >> 12;
            v2 += m1;
            v2 += v7;
            v13 ^= v2;
            v13 = v13 << (32 - 8) | v13 >> 8;
            v8 += v13;
            v7 ^= v8;
            v7 = v7 << (32 - 7) | v7 >> 7;
            v3 += m4;
            v3 += v4;
            v14 ^= v3;
            v14 = v14 << (32 - 8) | v14 >> 8;
            v9 += v14;
            v4 ^= v9;
            v4 = v4 << (32 - 7) | v4 >> 7;
            v1 += m6;
            v1 += v6;
            v12 ^= v1;
            v12 = v12 << (32 - 8) | v12 >> 8;
            v11 += v12;
            v6 ^= v11;
            v6 = v6 << (32 - 7) | v6 >> 7;
            v0 += m14;
            v0 += v5;
            v15 ^= v0;
            v15 = v15 << (32 - 8) | v15 >> 8;
            v10 += v15;
            v5 ^= v10;
            v5 = v5 << (32 - 7) | v5 >> 7;

            // Round 4.
            v0 += m7;
            v0 += v4;
            v12 ^= v0;
            v12 = v12 << (32 - 16) | v12 >> 16;
            v8 += v12;
            v4 ^= v8;
            v4 = v4 << (32 - 12) | v4 >> 12;
            v1 += m3;
            v1 += v5;
            v13 ^= v1;
            v13 = v13 << (32 - 16) | v13 >> 16;
            v9 += v13;
            v5 ^= v9;
            v5 = v5 << (32 - 12) | v5 >> 12;
            v2 += m13;
            v2 += v6;
            v14 ^= v2;
            v14 = v14 << (32 - 16) | v14 >> 16;
            v10 += v14;
            v6 ^= v10;
            v6 = v6 << (32 - 12) | v6 >> 12;
            v3 += m11;
            v3 += v7;
            v15 ^= v3;
            v15 = v15 << (32 - 16) | v15 >> 16;
            v11 += v15;
            v7 ^= v11;
            v7 = v7 << (32 - 12) | v7 >> 12;
            v2 += m12;
            v2 += v6;
            v14 ^= v2;
            v14 = v14 << (32 - 8) | v14 >> 8;
            v10 += v14;
            v6 ^= v10;
            v6 = v6 << (32 - 7) | v6 >> 7;
            v3 += m14;
            v3 += v7;
            v15 ^= v3;
            v15 = v15 << (32 - 8) | v15 >> 8;
            v11 += v15;
            v7 ^= v11;
            v7 = v7 << (32 - 7) | v7 >> 7;
            v1 += m1;
            v1 += v5;
            v13 ^= v1;
            v13 = v13 << (32 - 8) | v13 >> 8;
            v9 += v13;
            v5 ^= v9;
            v5 = v5 << (32 - 7) | v5 >> 7;
            v0 += m9;
            v0 += v4;
            v12 ^= v0;
            v12 = v12 << (32 - 8) | v12 >> 8;
            v8 += v12;
            v4 ^= v8;
            v4 = v4 << (32 - 7) | v4 >> 7;
            v0 += m2;
            v0 += v5;
            v15 ^= v0;
            v15 = v15 << (32 - 16) | v15 >> 16;
            v10 += v15;
            v5 ^= v10;
            v5 = v5 << (32 - 12) | v5 >> 12;
            v1 += m5;
            v1 += v6;
            v12 ^= v1;
            v12 = v12 << (32 - 16) | v12 >> 16;
            v11 += v12;
            v6 ^= v11;
            v6 = v6 << (32 - 12) | v6 >> 12;
            v2 += m4;
            v2 += v7;
            v13 ^= v2;
            v13 = v13 << (32 - 16) | v13 >> 16;
            v8 += v13;
            v7 ^= v8;
            v7 = v7 << (32 - 12) | v7 >> 12;
            v3 += m15;
            v3 += v4;
            v14 ^= v3;
            v14 = v14 << (32 - 16) | v14 >> 16;
            v9 += v14;
            v4 ^= v9;
            v4 = v4 << (32 - 12) | v4 >> 12;
            v2 += m0;
            v2 += v7;
            v13 ^= v2;
            v13 = v13 << (32 - 8) | v13 >> 8;
            v8 += v13;
            v7 ^= v8;
            v7 = v7 << (32 - 7) | v7 >> 7;
            v3 += m8;
            v3 += v4;
            v14 ^= v3;
            v14 = v14 << (32 - 8) | v14 >> 8;
            v9 += v14;
            v4 ^= v9;
            v4 = v4 << (32 - 7) | v4 >> 7;
            v1 += m10;
            v1 += v6;
            v12 ^= v1;
            v12 = v12 << (32 - 8) | v12 >> 8;
            v11 += v12;
            v6 ^= v11;
            v6 = v6 << (32 - 7) | v6 >> 7;
            v0 += m6;
            v0 += v5;
            v15 ^= v0;
            v15 = v15 << (32 - 8) | v15 >> 8;
            v10 += v15;
            v5 ^= v10;
            v5 = v5 << (32 - 7) | v5 >> 7;

            // Round 5.
            v0 += m9;
            v0 += v4;
            v12 ^= v0;
            v12 = v12 << (32 - 16) | v12 >> 16;
            v8 += v12;
            v4 ^= v8;
            v4 = v4 << (32 - 12) | v4 >> 12;
            v1 += m5;
            v1 += v5;
            v13 ^= v1;
            v13 = v13 << (32 - 16) | v13 >> 16;
            v9 += v13;
            v5 ^= v9;
            v5 = v5 << (32 - 12) | v5 >> 12;
            v2 += m2;
            v2 += v6;
            v14 ^= v2;
            v14 = v14 << (32 - 16) | v14 >> 16;
            v10 += v14;
            v6 ^= v10;
            v6 = v6 << (32 - 12) | v6 >> 12;
            v3 += m10;
            v3 += v7;
            v15 ^= v3;
            v15 = v15 << (32 - 16) | v15 >> 16;
            v11 += v15;
            v7 ^= v11;
            v7 = v7 << (32 - 12) | v7 >> 12;
            v2 += m4;
            v2 += v6;
            v14 ^= v2;
            v14 = v14 << (32 - 8) | v14 >> 8;
            v10 += v14;
            v6 ^= v10;
            v6 = v6 << (32 - 7) | v6 >> 7;
            v3 += m15;
            v3 += v7;
            v15 ^= v3;
            v15 = v15 << (32 - 8) | v15 >> 8;
            v11 += v15;
            v7 ^= v11;
            v7 = v7 << (32 - 7) | v7 >> 7;
            v1 += m7;
            v1 += v5;
            v13 ^= v1;
            v13 = v13 << (32 - 8) | v13 >> 8;
            v9 += v13;
            v5 ^= v9;
            v5 = v5 << (32 - 7) | v5 >> 7;
            v0 += m0;
            v0 += v4;
            v12 ^= v0;
            v12 = v12 << (32 - 8) | v12 >> 8;
            v8 += v12;
            v4 ^= v8;
            v4 = v4 << (32 - 7) | v4 >> 7;
            v0 += m14;
            v0 += v5;
            v15 ^= v0;
            v15 = v15 << (32 - 16) | v15 >> 16;
            v10 += v15;
            v5 ^= v10;
            v5 = v5 << (32 - 12) | v5 >> 12;
            v1 += m11;
            v1 += v6;
            v12 ^= v1;
            v12 = v12 << (32 - 16) | v12 >> 16;
            v11 += v12;
            v6 ^= v11;
            v6 = v6 << (32 - 12) | v6 >> 12;
            v2 += m6;
            v2 += v7;
            v13 ^= v2;
            v13 = v13 << (32 - 16) | v13 >> 16;
            v8 += v13;
            v7 ^= v8;
            v7 = v7 << (32 - 12) | v7 >> 12;
            v3 += m3;
            v3 += v4;
            v14 ^= v3;
            v14 = v14 << (32 - 16) | v14 >> 16;
            v9 += v14;
            v4 ^= v9;
            v4 = v4 << (32 - 12) | v4 >> 12;
            v2 += m8;
            v2 += v7;
            v13 ^= v2;
            v13 = v13 << (32 - 8) | v13 >> 8;
            v8 += v13;
            v7 ^= v8;
            v7 = v7 << (32 - 7) | v7 >> 7;
            v3 += m13;
            v3 += v4;
            v14 ^= v3;
            v14 = v14 << (32 - 8) | v14 >> 8;
            v9 += v14;
            v4 ^= v9;
            v4 = v4 << (32 - 7) | v4 >> 7;
            v1 += m12;
            v1 += v6;
            v12 ^= v1;
            v12 = v12 << (32 - 8) | v12 >> 8;
            v11 += v12;
            v6 ^= v11;
            v6 = v6 << (32 - 7) | v6 >> 7;
            v0 += m1;
            v0 += v5;
            v15 ^= v0;
            v15 = v15 << (32 - 8) | v15 >> 8;
            v10 += v15;
            v5 ^= v10;
            v5 = v5 << (32 - 7) | v5 >> 7;

            // Round 6.
            v0 += m2;
            v0 += v4;
            v12 ^= v0;
            v12 = v12 << (32 - 16) | v12 >> 16;
            v8 += v12;
            v4 ^= v8;
            v4 = v4 << (32 - 12) | v4 >> 12;
            v1 += m6;
            v1 += v5;
            v13 ^= v1;
            v13 = v13 << (32 - 16) | v13 >> 16;
            v9 += v13;
            v5 ^= v9;
            v5 = v5 << (32 - 12) | v5 >> 12;
            v2 += m0;
            v2 += v6;
            v14 ^= v2;
            v14 = v14 << (32 - 16) | v14 >> 16;
            v10 += v14;
            v6 ^= v10;
            v6 = v6 << (32 - 12) | v6 >> 12;
            v3 += m8;
            v3 += v7;
            v15 ^= v3;
            v15 = v15 << (32 - 16) | v15 >> 16;
            v11 += v15;
            v7 ^= v11;
            v7 = v7 << (32 - 12) | v7 >> 12;
            v2 += m11;
            v2 += v6;
            v14 ^= v2;
            v14 = v14 << (32 - 8) | v14 >> 8;
            v10 += v14;
            v6 ^= v10;
            v6 = v6 << (32 - 7) | v6 >> 7;
            v3 += m3;
            v3 += v7;
            v15 ^= v3;
            v15 = v15 << (32 - 8) | v15 >> 8;
            v11 += v15;
            v7 ^= v11;
            v7 = v7 << (32 - 7) | v7 >> 7;
            v1 += m10;
            v1 += v5;
            v13 ^= v1;
            v13 = v13 << (32 - 8) | v13 >> 8;
            v9 += v13;
            v5 ^= v9;
            v5 = v5 << (32 - 7) | v5 >> 7;
            v0 += m12;
            v0 += v4;
            v12 ^= v0;
            v12 = v12 << (32 - 8) | v12 >> 8;
            v8 += v12;
            v4 ^= v8;
            v4 = v4 << (32 - 7) | v4 >> 7;
            v0 += m4;
            v0 += v5;
            v15 ^= v0;
            v15 = v15 << (32 - 16) | v15 >> 16;
            v10 += v15;
            v5 ^= v10;
            v5 = v5 << (32 - 12) | v5 >> 12;
            v1 += m7;
            v1 += v6;
            v12 ^= v1;
            v12 = v12 << (32 - 16) | v12 >> 16;
            v11 += v12;
            v6 ^= v11;
            v6 = v6 << (32 - 12) | v6 >> 12;
            v2 += m15;
            v2 += v7;
            v13 ^= v2;
            v13 = v13 << (32 - 16) | v13 >> 16;
            v8 += v13;
            v7 ^= v8;
            v7 = v7 << (32 - 12) | v7 >> 12;
            v3 += m1;
            v3 += v4;
            v14 ^= v3;
            v14 = v14 << (32 - 16) | v14 >> 16;
            v9 += v14;
            v4 ^= v9;
            v4 = v4 << (32 - 12) | v4 >> 12;
            v2 += m14;
            v2 += v7;
            v13 ^= v2;
            v13 = v13 << (32 - 8) | v13 >> 8;
            v8 += v13;
            v7 ^= v8;
            v7 = v7 << (32 - 7) | v7 >> 7;
            v3 += m9;
            v3 += v4;
            v14 ^= v3;
            v14 = v14 << (32 - 8) | v14 >> 8;
            v9 += v14;
            v4 ^= v9;
            v4 = v4 << (32 - 7) | v4 >> 7;
            v1 += m5;
            v1 += v6;
            v12 ^= v1;
            v12 = v12 << (32 - 8) | v12 >> 8;
            v11 += v12;
            v6 ^= v11;
            v6 = v6 << (32 - 7) | v6 >> 7;
            v0 += m13;
            v0 += v5;
            v15 ^= v0;
            v15 = v15 << (32 - 8) | v15 >> 8;
            v10 += v15;
            v5 ^= v10;
            v5 = v5 << (32 - 7) | v5 >> 7;

            // Round 7.
            v0 += m12;
            v0 += v4;
            v12 ^= v0;
            v12 = v12 << (32 - 16) | v12 >> 16;
            v8 += v12;
            v4 ^= v8;
            v4 = v4 << (32 - 12) | v4 >> 12;
            v1 += m1;
            v1 += v5;
            v13 ^= v1;
            v13 = v13 << (32 - 16) | v13 >> 16;
            v9 += v13;
            v5 ^= v9;
            v5 = v5 << (32 - 12) | v5 >> 12;
            v2 += m14;
            v2 += v6;
            v14 ^= v2;
            v14 = v14 << (32 - 16) | v14 >> 16;
            v10 += v14;
            v6 ^= v10;
            v6 = v6 << (32 - 12) | v6 >> 12;
            v3 += m4;
            v3 += v7;
            v15 ^= v3;
            v15 = v15 << (32 - 16) | v15 >> 16;
            v11 += v15;
            v7 ^= v11;
            v7 = v7 << (32 - 12) | v7 >> 12;
            v2 += m13;
            v2 += v6;
            v14 ^= v2;
            v14 = v14 << (32 - 8) | v14 >> 8;
            v10 += v14;
            v6 ^= v10;
            v6 = v6 << (32 - 7) | v6 >> 7;
            v3 += m10;
            v3 += v7;
            v15 ^= v3;
            v15 = v15 << (32 - 8) | v15 >> 8;
            v11 += v15;
            v7 ^= v11;
            v7 = v7 << (32 - 7) | v7 >> 7;
            v1 += m15;
            v1 += v5;
            v13 ^= v1;
            v13 = v13 << (32 - 8) | v13 >> 8;
            v9 += v13;
            v5 ^= v9;
            v5 = v5 << (32 - 7) | v5 >> 7;
            v0 += m5;
            v0 += v4;
            v12 ^= v0;
            v12 = v12 << (32 - 8) | v12 >> 8;
            v8 += v12;
            v4 ^= v8;
            v4 = v4 << (32 - 7) | v4 >> 7;
            v0 += m0;
            v0 += v5;
            v15 ^= v0;
            v15 = v15 << (32 - 16) | v15 >> 16;
            v10 += v15;
            v5 ^= v10;
            v5 = v5 << (32 - 12) | v5 >> 12;
            v1 += m6;
            v1 += v6;
            v12 ^= v1;
            v12 = v12 << (32 - 16) | v12 >> 16;
            v11 += v12;
            v6 ^= v11;
            v6 = v6 << (32 - 12) | v6 >> 12;
            v2 += m9;
            v2 += v7;
            v13 ^= v2;
            v13 = v13 << (32 - 16) | v13 >> 16;
            v8 += v13;
            v7 ^= v8;
            v7 = v7 << (32 - 12) | v7 >> 12;
            v3 += m8;
            v3 += v4;
            v14 ^= v3;
            v14 = v14 << (32 - 16) | v14 >> 16;
            v9 += v14;
            v4 ^= v9;
            v4 = v4 << (32 - 12) | v4 >> 12;
            v2 += m2;
            v2 += v7;
            v13 ^= v2;
            v13 = v13 << (32 - 8) | v13 >> 8;
            v8 += v13;
            v7 ^= v8;
            v7 = v7 << (32 - 7) | v7 >> 7;
            v3 += m11;
            v3 += v4;
            v14 ^= v3;
            v14 = v14 << (32 - 8) | v14 >> 8;
            v9 += v14;
            v4 ^= v9;
            v4 = v4 << (32 - 7) | v4 >> 7;
            v1 += m3;
            v1 += v6;
            v12 ^= v1;
            v12 = v12 << (32 - 8) | v12 >> 8;
            v11 += v12;
            v6 ^= v11;
            v6 = v6 << (32 - 7) | v6 >> 7;
            v0 += m7;
            v0 += v5;
            v15 ^= v0;
            v15 = v15 << (32 - 8) | v15 >> 8;
            v10 += v15;
            v5 ^= v10;
            v5 = v5 << (32 - 7) | v5 >> 7;

            // Round 8.
            v0 += m13;
            v0 += v4;
            v12 ^= v0;
            v12 = v12 << (32 - 16) | v12 >> 16;
            v8 += v12;
            v4 ^= v8;
            v4 = v4 << (32 - 12) | v4 >> 12;
            v1 += m7;
            v1 += v5;
            v13 ^= v1;
            v13 = v13 << (32 - 16) | v13 >> 16;
            v9 += v13;
            v5 ^= v9;
            v5 = v5 << (32 - 12) | v5 >> 12;
            v2 += m12;
            v2 += v6;
            v14 ^= v2;
            v14 = v14 << (32 - 16) | v14 >> 16;
            v10 += v14;
            v6 ^= v10;
            v6 = v6 << (32 - 12) | v6 >> 12;
            v3 += m3;
            v3 += v7;
            v15 ^= v3;
            v15 = v15 << (32 - 16) | v15 >> 16;
            v11 += v15;
            v7 ^= v11;
            v7 = v7 << (32 - 12) | v7 >> 12;
            v2 += m1;
            v2 += v6;
            v14 ^= v2;
            v14 = v14 << (32 - 8) | v14 >> 8;
            v10 += v14;
            v6 ^= v10;
            v6 = v6 << (32 - 7) | v6 >> 7;
            v3 += m9;
            v3 += v7;
            v15 ^= v3;
            v15 = v15 << (32 - 8) | v15 >> 8;
            v11 += v15;
            v7 ^= v11;
            v7 = v7 << (32 - 7) | v7 >> 7;
            v1 += m14;
            v1 += v5;
            v13 ^= v1;
            v13 = v13 << (32 - 8) | v13 >> 8;
            v9 += v13;
            v5 ^= v9;
            v5 = v5 << (32 - 7) | v5 >> 7;
            v0 += m11;
            v0 += v4;
            v12 ^= v0;
            v12 = v12 << (32 - 8) | v12 >> 8;
            v8 += v12;
            v4 ^= v8;
            v4 = v4 << (32 - 7) | v4 >> 7;
            v0 += m5;
            v0 += v5;
            v15 ^= v0;
            v15 = v15 << (32 - 16) | v15 >> 16;
            v10 += v15;
            v5 ^= v10;
            v5 = v5 << (32 - 12) | v5 >> 12;
            v1 += m15;
            v1 += v6;
            v12 ^= v1;
            v12 = v12 << (32 - 16) | v12 >> 16;
            v11 += v12;
            v6 ^= v11;
            v6 = v6 << (32 - 12) | v6 >> 12;
            v2 += m8;
            v2 += v7;
            v13 ^= v2;
            v13 = v13 << (32 - 16) | v13 >> 16;
            v8 += v13;
            v7 ^= v8;
            v7 = v7 << (32 - 12) | v7 >> 12;
            v3 += m2;
            v3 += v4;
            v14 ^= v3;
            v14 = v14 << (32 - 16) | v14 >> 16;
            v9 += v14;
            v4 ^= v9;
            v4 = v4 << (32 - 12) | v4 >> 12;
            v2 += m6;
            v2 += v7;
            v13 ^= v2;
            v13 = v13 << (32 - 8) | v13 >> 8;
            v8 += v13;
            v7 ^= v8;
            v7 = v7 << (32 - 7) | v7 >> 7;
            v3 += m10;
            v3 += v4;
            v14 ^= v3;
            v14 = v14 << (32 - 8) | v14 >> 8;
            v9 += v14;
            v4 ^= v9;
            v4 = v4 << (32 - 7) | v4 >> 7;
            v1 += m4;
            v1 += v6;
            v12 ^= v1;
            v12 = v12 << (32 - 8) | v12 >> 8;
            v11 += v12;
            v6 ^= v11;
            v6 = v6 << (32 - 7) | v6 >> 7;
            v0 += m0;
            v0 += v5;
            v15 ^= v0;
            v15 = v15 << (32 - 8) | v15 >> 8;
            v10 += v15;
            v5 ^= v10;
            v5 = v5 << (32 - 7) | v5 >> 7;

            // Round 9.
            v0 += m6;
            v0 += v4;
            v12 ^= v0;
            v12 = v12 << (32 - 16) | v12 >> 16;
            v8 += v12;
            v4 ^= v8;
            v4 = v4 << (32 - 12) | v4 >> 12;
            v1 += m14;
            v1 += v5;
            v13 ^= v1;
            v13 = v13 << (32 - 16) | v13 >> 16;
            v9 += v13;
            v5 ^= v9;
            v5 = v5 << (32 - 12) | v5 >> 12;
            v2 += m11;
            v2 += v6;
            v14 ^= v2;
            v14 = v14 << (32 - 16) | v14 >> 16;
            v10 += v14;
            v6 ^= v10;
            v6 = v6 << (32 - 12) | v6 >> 12;
            v3 += m0;
            v3 += v7;
            v15 ^= v3;
            v15 = v15 << (32 - 16) | v15 >> 16;
            v11 += v15;
            v7 ^= v11;
            v7 = v7 << (32 - 12) | v7 >> 12;
            v2 += m3;
            v2 += v6;
            v14 ^= v2;
            v14 = v14 << (32 - 8) | v14 >> 8;
            v10 += v14;
            v6 ^= v10;
            v6 = v6 << (32 - 7) | v6 >> 7;
            v3 += m8;
            v3 += v7;
            v15 ^= v3;
            v15 = v15 << (32 - 8) | v15 >> 8;
            v11 += v15;
            v7 ^= v11;
            v7 = v7 << (32 - 7) | v7 >> 7;
            v1 += m9;
            v1 += v5;
            v13 ^= v1;
            v13 = v13 << (32 - 8) | v13 >> 8;
            v9 += v13;
            v5 ^= v9;
            v5 = v5 << (32 - 7) | v5 >> 7;
            v0 += m15;
            v0 += v4;
            v12 ^= v0;
            v12 = v12 << (32 - 8) | v12 >> 8;
            v8 += v12;
            v4 ^= v8;
            v4 = v4 << (32 - 7) | v4 >> 7;
            v0 += m12;
            v0 += v5;
            v15 ^= v0;
            v15 = v15 << (32 - 16) | v15 >> 16;
            v10 += v15;
            v5 ^= v10;
            v5 = v5 << (32 - 12) | v5 >> 12;
            v1 += m13;
            v1 += v6;
            v12 ^= v1;
            v12 = v12 << (32 - 16) | v12 >> 16;
            v11 += v12;
            v6 ^= v11;
            v6 = v6 << (32 - 12) | v6 >> 12;
            v2 += m1;
            v2 += v7;
            v13 ^= v2;
            v13 = v13 << (32 - 16) | v13 >> 16;
            v8 += v13;
            v7 ^= v8;
            v7 = v7 << (32 - 12) | v7 >> 12;
            v3 += m10;
            v3 += v4;
            v14 ^= v3;
            v14 = v14 << (32 - 16) | v14 >> 16;
            v9 += v14;
            v4 ^= v9;
            v4 = v4 << (32 - 12) | v4 >> 12;
            v2 += m4;
            v2 += v7;
            v13 ^= v2;
            v13 = v13 << (32 - 8) | v13 >> 8;
            v8 += v13;
            v7 ^= v8;
            v7 = v7 << (32 - 7) | v7 >> 7;
            v3 += m5;
            v3 += v4;
            v14 ^= v3;
            v14 = v14 << (32 - 8) | v14 >> 8;
            v9 += v14;
            v4 ^= v9;
            v4 = v4 << (32 - 7) | v4 >> 7;
            v1 += m7;
            v1 += v6;
            v12 ^= v1;
            v12 = v12 << (32 - 8) | v12 >> 8;
            v11 += v12;
            v6 ^= v11;
            v6 = v6 << (32 - 7) | v6 >> 7;
            v0 += m2;
            v0 += v5;
            v15 ^= v0;
            v15 = v15 << (32 - 8) | v15 >> 8;
            v10 += v15;
            v5 ^= v10;
            v5 = v5 << (32 - 7) | v5 >> 7;

            // Round 10.
            v0 += m10;
            v0 += v4;
            v12 ^= v0;
            v12 = v12 << (32 - 16) | v12 >> 16;
            v8 += v12;
            v4 ^= v8;
            v4 = v4 << (32 - 12) | v4 >> 12;
            v1 += m8;
            v1 += v5;
            v13 ^= v1;
            v13 = v13 << (32 - 16) | v13 >> 16;
            v9 += v13;
            v5 ^= v9;
            v5 = v5 << (32 - 12) | v5 >> 12;
            v2 += m7;
            v2 += v6;
            v14 ^= v2;
            v14 = v14 << (32 - 16) | v14 >> 16;
            v10 += v14;
            v6 ^= v10;
            v6 = v6 << (32 - 12) | v6 >> 12;
            v3 += m1;
            v3 += v7;
            v15 ^= v3;
            v15 = v15 << (32 - 16) | v15 >> 16;
            v11 += v15;
            v7 ^= v11;
            v7 = v7 << (32 - 12) | v7 >> 12;
            v2 += m6;
            v2 += v6;
            v14 ^= v2;
            v14 = v14 << (32 - 8) | v14 >> 8;
            v10 += v14;
            v6 ^= v10;
            v6 = v6 << (32 - 7) | v6 >> 7;
            v3 += m5;
            v3 += v7;
            v15 ^= v3;
            v15 = v15 << (32 - 8) | v15 >> 8;
            v11 += v15;
            v7 ^= v11;
            v7 = v7 << (32 - 7) | v7 >> 7;
            v1 += m4;
            v1 += v5;
            v13 ^= v1;
            v13 = v13 << (32 - 8) | v13 >> 8;
            v9 += v13;
            v5 ^= v9;
            v5 = v5 << (32 - 7) | v5 >> 7;
            v0 += m2;
            v0 += v4;
            v12 ^= v0;
            v12 = v12 << (32 - 8) | v12 >> 8;
            v8 += v12;
            v4 ^= v8;
            v4 = v4 << (32 - 7) | v4 >> 7;
            v0 += m15;
            v0 += v5;
            v15 ^= v0;
            v15 = v15 << (32 - 16) | v15 >> 16;
            v10 += v15;
            v5 ^= v10;
            v5 = v5 << (32 - 12) | v5 >> 12;
            v1 += m9;
            v1 += v6;
            v12 ^= v1;
            v12 = v12 << (32 - 16) | v12 >> 16;
            v11 += v12;
            v6 ^= v11;
            v6 = v6 << (32 - 12) | v6 >> 12;
            v2 += m3;
            v2 += v7;
            v13 ^= v2;
            v13 = v13 << (32 - 16) | v13 >> 16;
            v8 += v13;
            v7 ^= v8;
            v7 = v7 << (32 - 12) | v7 >> 12;
            v3 += m13;
            v3 += v4;
            v14 ^= v3;
            v14 = v14 << (32 - 16) | v14 >> 16;
            v9 += v14;
            v4 ^= v9;
            v4 = v4 << (32 - 12) | v4 >> 12;
            v2 += m12;
            v2 += v7;
            v13 ^= v2;
            v13 = v13 << (32 - 8) | v13 >> 8;
            v8 += v13;
            v7 ^= v8;
            v7 = v7 << (32 - 7) | v7 >> 7;
            v3 += m0;
            v3 += v4;
            v14 ^= v3;
            v14 = v14 << (32 - 8) | v14 >> 8;
            v9 += v14;
            v4 ^= v9;
            v4 = v4 << (32 - 7) | v4 >> 7;
            v1 += m14;
            v1 += v6;
            v12 ^= v1;
            v12 = v12 << (32 - 8) | v12 >> 8;
            v11 += v12;
            v6 ^= v11;
            v6 = (v6 << (32 - 7)) | (v6 >> 7);
            v0 += m11;
            v0 += v5;
            v15 ^= v0;
            v15 = (v15 << (32 - 8)) | (v15 >> 8);
            v10 += v15;
            v5 ^= v10;
            v5 = (v5 << (32 - 7)) | (v5 >> 7);
//*/
            //Finalization
            _h[0] ^= v0 ^ v8;
            _h[1] ^= v1 ^ v9;
            _h[2] ^= v2 ^ v10;
            _h[3] ^= v3 ^ v11;
            _h[4] ^= v4 ^ v12;
            _h[5] ^= v5 ^ v13;
            _h[6] ^= v6 ^ v14;
            _h[7] ^= v7 ^ v15;
        }
    }
}